//#include<stdio.h>
//
//int main()
//{
//	int aa[2][5] = { 10,9,8,7,6,5,4,3,2,1 };
//	int* ptr1 = (int*)(&aa + 1);
//	int* ptr2 = (int*)(*(aa + 1));
//	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
//	return 0;
//}

//#include<stdio.h>
// 
//int main()
//{
//	int a[5] = { 5, 4, 3, 2, 1 };
//	int* ptr = (int*)(&a + 1);
//	printf("%d,%d", *(a + 1), *(ptr - 1));
//	return 0;
//}

//#include<stdio.h>
//#include <stdlib.h>   
//#include <string.h>    
//
//struct student
//{
//	char name[20];
//	int age;
//};
//
//int cmp_int(const void* e1, const void* e2)
//{
//		return 	(*(int*)e1)-(*(int*)e2);
//}
//
//int cmp_struct(const void* e1, const void* e2)
//{
//	return  strcmp(((struct student*)e1)->name, ((struct student*)e2)->name);
//}
//
//int main()
//{
//	//void qsort(void* base, size_t num, size_t size,int (*compar)(const void*, const void*));
//	int a1[] = { 2,1,4,5,3 };
//	int sz1 = sizeof(a1) / sizeof(a1[0]);
//	qsort(a1, sz1, sizeof(int),cmp_int);
//	for (int n = 0; n < sz1; n++)
//	{
//        printf("%d ", a1[n]);
//	}
//		
//	struct student a2[] = { {"zhangsan",12},{"lisi",13},{"wangwu",20} };
//	int sz2 = sizeof(a2) / sizeof(a2[0]);
//
//	qsort(a2, sz2, sizeof(struct student), cmp_struct);
//	return 0;
//}

#include<stdio.h>   

void swap(char* buf1, char* buf2,int size)
{
	char temp = *buf1;
	*buf1 = *buf2;
	*buf2 = temp;
	buf1++;
	buf2++;
}

int cmp_int(const void* e1, const void* e2)
{
		return 	(*(int*)e1)-(*(int*)e2);
}

void my_qsort(void* base, int num, int size, int (*cmp)(const void* e1, const void* e2))
{
	for (int i = 0; i < num-1; i++)
	{
		for (int j = 0; j < num - 1 - i; j++)
		{
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
                swap((char*)base + j * size, (char*)base + (j + 1) * size,size);
			}
		}
	}
}


int main()
{
	int a[] = { 1,3,5,2,4, };
	my_qsort(a, 5, 4, cmp_int);
	for (int n = 0; n < 5; n++)
	{
		printf("%d ", a[n]);
	}
	return 0;
}